/**
 * 
 */
package de.akabahn.ebd.stw.zdxfc.prs.elemente;

import org.apache.log4j.Logger;

import de.akabahn.ebd.comm.dbd.DBDParameter;
import de.akabahn.ebd.dbd.DBDSubscriptionListener;
import de.akabahn.ebd.stw.zdxfc.prs.ZDXFCMain;

/**
 * Basis-Klasse fuer alle Fahrweg-Elemente, enthaelt die grundlegenden Eigenschaften, die fuer alle Elemente gleich
 * sind.
 * 
 * @author Peter Eimann
 * @since 1.0
 * @version 1.2
 */
public abstract class FahrwegElement implements DBDSubscriptionListener {

	private final static Logger LOG = Logger.getLogger(FahrwegElement.class);
	
	private boolean aktiv;
	private boolean aufloesenVorbereiten;
	
	protected ZDXFCMain main;
	protected String id;

	/**
	 * Initialisierung der Klasse
	 * 
	 * @param id
	 *            Eindeutige ID des Elements, wird fuer die Referenz auf das
	 *            Element benoetigt (die ID ist der Schluessel in den Maps, in
	 *            denen das Element gespeichert ist.
	 * @param main
	 *            Referenz auf die Hauptklasse
	 */
	public FahrwegElement(String id, ZDXFCMain main) {
		this.id = id;
		this.main = main;
	}

	/**
	 * Gibt an, ob das Element in einer Fahrstrasse beansprucht wird oder nicht
	 * 
	 * @return <code>true</code> - Element wird in einer Fahrstrasse beansprucht
	 */
	public boolean isAktiv() {
		return aktiv;
	}

	/**
	 * Setzt das Aktiv-Flag des Elements
	 * 
	 * @param aktiv Das Aktiv-Flag
	 */
	public void setAktiv(boolean aktiv) {
		this.aktiv = aktiv;
		LOG.info(id + ": Aktiv = " + aktiv);
	}

	/**
	 * Gibt an, ob das Aufloesen-Vorbereiten Flag gesetzt ist oder nicht
	 * 
	 * @return <code>true</code> - das Aufloesen-Vorbereiten Flag ist gesetzt
	 */
	public boolean isAufloesenVorbereiten() {
		return aufloesenVorbereiten;
	}

	/**
	 * Setzt das Aufloesen-Vorbereiten Flag
	 * 
	 * @param aufloesenVorbereiten Das Aufloesen-Vorbereiten Flag
	 */
	public void setAufloesenVorbereiten(boolean aufloesenVorbereiten) {
		this.aufloesenVorbereiten = aufloesenVorbereiten;
		LOG.info(id + ": Aufloesen vorbereiten = " + aufloesenVorbereiten);
	}

	/**
	 * Gibt die ID des Elements an
	 * 
	 * @return die ID
	 */
	public String getId() {
		return id;
	}

	/**
	 * Wird bei Aenderung einer abonnierten DBD-Variablen vom <code>ZDXFCDispatcher</code> aufgerufen, wenn die 
	 * Aenderung fuer ein Fahrwegelement relevant ist.<br>
	 * Ruft nacheinander
	 * <ol>
	 * <li><code>onChangeProcess(dbd)</code></li>
	 * <li><code>onChangePostProcess(dbd)</code></li>
	 * </ol>
	 * auf. Diese Methoden muessen in den konkreten Elementen implementiert werden, um die Aenderung zu verarbeiten.
	 * 
	 * @param dbd Die geaenderte Variable
	 * @see #onChangeProcess(DBDParameter)
	 * @see #onChangePostProcess(DBDParameter)
	 */
	@Override
	public void onChange(DBDParameter dbd) {
		onChangeProcess(dbd);
		onChangePostProcess(dbd);
	}
	
	/**
	 * Leere Implementierung in dieser Klasse
	 * 
	 * @param dbd Die geaenderte Variable
	 */
	public void onChangeProcess(DBDParameter dbd) {
	}

	/**
	 * Leere Implementierung in dieser Klasse
	 * 
	 * @param dbd Die geaenderte Variable
	 */
	public void onChangePostProcess(DBDParameter dbd) {
	}
}

